home *** CD-ROM | disk | FTP | other *** search
/ DOOM Companion (Alt) / DOOM Companion CD-ROM - iso.7z / DOOM Companion CD-ROM.iso / multi / sersrc / sersetup.c < prev    next >
C/C++ Source or Header  |  1994-02-13  |  9KB  |  545 lines

  1. // sersetup.c
  2.  
  3. #include "sersetup.h"
  4. #include "DoomNet.h"
  5.  
  6. extern    que_t        inque, outque;
  7.  
  8. void jump_start( void );
  9. extern int     uart;
  10.  
  11. int            usemodem;
  12. char        startup[256], shutdown[256];
  13.  
  14.  
  15. void ModemCommand (char *str);
  16.  
  17.  
  18. /*
  19. ================
  20. =
  21. = write_buffer
  22. =
  23. ================
  24. */
  25.  
  26. void write_buffer( char *buffer, unsigned int count )
  27. {
  28.     int    i;
  29.  
  30. // if this would overrun the buffer, throw everything else out
  31.     if (outque.head-outque.tail+count > QUESIZE)
  32.         outque.tail = outque.head;
  33.  
  34.     while (count--)
  35.         write_byte (*buffer++);
  36.  
  37.     if ( INPUT( uart + LINE_STATUS_REGISTER ) & 0x40)
  38.         jump_start();
  39. }
  40.  
  41.  
  42. /*
  43. =================
  44. =
  45. = Error
  46. =
  47. = For abnormal program terminations
  48. =
  49. =================
  50. */
  51.  
  52. void Error (char *error, ...)
  53. {
  54.     va_list argptr;
  55.  
  56.     if (usemodem)
  57.     {
  58.         printf ("\n");
  59.         printf ("\nDropping DTR\n");
  60.         OUTPUT( uart + MODEM_CONTROL_REGISTER
  61.             , INPUT( uart + MODEM_CONTROL_REGISTER ) & ~MCR_DTR );
  62.         delay (1250);
  63.         OUTPUT( uart + MODEM_CONTROL_REGISTER
  64.             , INPUT( uart + MODEM_CONTROL_REGISTER ) | MCR_DTR );
  65.         ModemCommand("+++");
  66.         delay (1250);
  67.         ModemCommand(shutdown);
  68.         delay (1250);
  69.  
  70.     }
  71.  
  72.     ShutdownPort ();
  73.  
  74.     if (vectorishooked)
  75.         setvect (doomcom.intnum,olddoomvect);
  76.  
  77.     if (error)
  78.     {
  79.         va_start (argptr,error);
  80.         vprintf (error,argptr);
  81.         va_end (argptr);
  82.         printf ("\n");
  83.         exit (1);
  84.     }
  85.  
  86.     printf ("Clean exit from SERSETUP\n");
  87.     exit (0);
  88. }
  89.  
  90.  
  91. /*
  92. ================
  93. =
  94. = ReadPacket
  95. =
  96. ================
  97. */
  98.  
  99. #define MAXPACKET    512
  100. #define    FRAMECHAR    0x70
  101.  
  102. char    packet[MAXPACKET];
  103. int        packetlen;
  104. int        inescape;
  105. int        newpacket;
  106.  
  107. boolean ReadPacket (void)
  108. {
  109.     int    c;
  110.  
  111. // if the buffer has overflowed, throw everything out
  112.  
  113.     if (inque.head-inque.tail > QUESIZE - 4)    // check for buffer overflow
  114.     {
  115.         inque.tail = inque.head;
  116.         newpacket = true;
  117.         return false;
  118.     }
  119.  
  120.     if (newpacket)
  121.     {
  122.         packetlen = 0;
  123.         newpacket = 0;
  124.     }
  125.  
  126.     do
  127.     {
  128.         c = read_byte ();
  129.         if (c < 0)
  130.             return false;        // haven't read a complete packet
  131. //printf ("%c",c);
  132.         if (inescape)
  133.         {
  134.             inescape = false;
  135.             if (c!=FRAMECHAR)
  136.             {
  137.                 newpacket = 1;
  138.                 return true;    // got a good packet
  139.             }
  140.         }
  141.         else if (c==FRAMECHAR)
  142.         {
  143.             inescape = true;
  144.             continue;            // don't know yet if it is a terminator
  145.         }                        // or a literal FRAMECHAR
  146.  
  147.         if (packetlen >= MAXPACKET)
  148.             continue;            // oversize packet
  149.         packet[packetlen] = c;
  150.         packetlen++;
  151.     } while (1);
  152.  
  153. }
  154.  
  155.  
  156. /*
  157. =============
  158. =
  159. = WritePacket
  160. =
  161. =============
  162. */
  163.  
  164.  
  165.  
  166. void WritePacket (char *buffer, int len)
  167. {
  168.     int        b;
  169.     char    static localbuffer[MAXPACKET*2+2];
  170.  
  171.     b = 0;
  172.     if (len > MAXPACKET)
  173.         return;
  174.  
  175.     while (len--)
  176.     {
  177.         if (*buffer == FRAMECHAR)
  178.             localbuffer[b++] = FRAMECHAR;    // escape it for literal
  179.         localbuffer[b++] = *buffer++;
  180.     }
  181.  
  182.     localbuffer[b++] = FRAMECHAR;
  183.     localbuffer[b++] = 0;
  184.  
  185.     write_buffer (localbuffer, b);
  186. }
  187.  
  188.  
  189. /*
  190. =============
  191. =
  192. = NetISR
  193. =
  194. =============
  195. */
  196.  
  197. void interrupt NetISR (void)
  198. {
  199.     if (doomcom.command == CMD_SEND)
  200.     {
  201. //I_ColorBlack (0,0,63);
  202.         WritePacket ((char *)&doomcom.data, doomcom.datalength);
  203.     }
  204.     else if (doomcom.command == CMD_GET)
  205.     {
  206. //I_ColorBlack (63,63,0);
  207.  
  208.         if (ReadPacket () && packetlen <= sizeof(doomcom.data) )
  209.         {
  210.             doomcom.remotenode = 1;
  211.             doomcom.datalength = packetlen;
  212.             memcpy (&doomcom.data, &packet, packetlen);
  213.         }
  214.         else
  215.             doomcom.remotenode = -1;
  216.  
  217.     }
  218. //I_ColorBlack (0,0,0);
  219. }
  220.  
  221.  
  222.  
  223.  
  224. /*
  225. =================
  226. =
  227. = Connect
  228. =
  229. = Figures out who is player 0 and 1
  230. =================
  231. */
  232.  
  233. void Connect (void)
  234. {
  235.     struct time        time;
  236.     int                oldsec;
  237.     int        localstage, remotestage;
  238.     char    str[20];
  239.  
  240. //
  241. // wait for a good packet
  242. //
  243.     printf ("Attempting to connect across serial link, press escape to abort.\n");
  244.  
  245.     oldsec = -1;
  246.     localstage = remotestage = 0;
  247.  
  248.     do
  249.     {
  250.         while ( bioskey(1) )
  251.         {
  252.             if ( (bioskey (0) & 0xff) == 27)
  253.                 Error ("\n\nNetwork game synchronization aborted.");
  254.         }
  255.  
  256.         while (ReadPacket ())
  257.         {
  258.             packet[packetlen] = 0;
  259. //            printf ("read: %s\n",packet);
  260.             if (packetlen != 7)
  261.                 goto badpacket;
  262.             if (strncmp(packet,"PLAY",4) )
  263.                 goto badpacket;
  264.             remotestage = packet[6] - '0';
  265.             localstage = remotestage+1;
  266.             if (packet[4] == '0'+doomcom.consoleplayer)
  267.             {
  268.                 doomcom.consoleplayer ^= 1;
  269.                 localstage = remotestage = 0;
  270.             }
  271.             oldsec = -1;
  272.         }
  273. badpacket:
  274.  
  275.         gettime (&time);
  276.         if (time.ti_sec != oldsec)
  277.         {
  278.             oldsec = time.ti_sec;
  279.             sprintf (str,"PLAY%i_%i",doomcom.consoleplayer,localstage);
  280.             WritePacket (str,strlen(str));
  281. //            printf ("wrote: %s\n",str);
  282.         }
  283.  
  284.     } while (remotestage < 1);
  285.  
  286. //
  287. // flush out any extras
  288. //
  289.     while (ReadPacket ())
  290.     ;
  291. }
  292.  
  293.  
  294.  
  295. /*
  296. ==============
  297. =
  298. = ModemCommand
  299. =
  300. ==============
  301. */
  302.  
  303. void ModemCommand (char *str)
  304. {
  305.     printf ("Modem command : %s\n",str);
  306.     write_buffer (str,strlen(str));
  307.     write_buffer ("\r",1);
  308. }
  309.  
  310.  
  311. /*
  312. ==============
  313. =
  314. = ModemResponse
  315. =
  316. = Waits for OK, RING, CONNECT, etc
  317. ==============
  318. */
  319.  
  320. char    response[80];
  321.  
  322. void ModemResponse (char *resp)
  323. {
  324.     int        c;
  325.     int        respptr;
  326.  
  327.     do
  328.     {
  329.         printf ("Modem response: ");
  330.         respptr=0;
  331.         do
  332.         {
  333.             while ( bioskey(1) )
  334.             {
  335.                 if ( (bioskey (0) & 0xff) == 27)
  336.                     Error ("\nModem response aborted.");
  337.             }
  338.             c = read_byte ();
  339.             if (c==-1)
  340.                 continue;
  341.             if (c=='\n' || respptr == 79)
  342.             {
  343.                 response[respptr] = 0;
  344.                 printf ("%s\n",response);
  345.                 break;
  346.             }
  347.             if (c>=' ')
  348.             {
  349.                 response[respptr] = c;
  350.                 respptr++;
  351.             }
  352.         } while (1);
  353.  
  354.     } while (strncmp(response,resp,strlen(resp)));
  355. }
  356.  
  357.  
  358. /*
  359. =============
  360. =
  361. = ReadLine
  362. =
  363. =============
  364. */
  365.  
  366. void ReadLine (FILE *f, char *dest)
  367. {
  368.     int    c;
  369.  
  370.     do
  371.     {
  372.         c = fgetc (f);
  373.         if (c == EOF)
  374.             Error ("EOF in modem.cfg");
  375.         if (c == '\r' || c == '\n')
  376.             break;
  377.         *dest++ = c;
  378.     } while (1);
  379.     *dest = 0;
  380. }
  381.  
  382.  
  383. /*
  384. =============
  385. =
  386. = InitModem
  387. =
  388. =============
  389. */
  390.  
  391. void InitModem (void)
  392. {
  393.     int        mcr;
  394.     FILE    *f;
  395.  
  396.     f = fopen ("modem.cfg","r");
  397.     if (!f)
  398.         Error ("Couldn't read MODEM.CFG");
  399.     ReadLine (f, startup);
  400.     ReadLine (f, shutdown);
  401.     fclose (f);
  402.  
  403.     ModemCommand(startup);
  404.     ModemResponse ("OK");
  405. }
  406.  
  407.  
  408. /*
  409. =============
  410. =
  411. = Dial
  412. =
  413. =============
  414. */
  415.  
  416. void Dial (void)
  417. {
  418.     char    cmd[80];
  419.     int        p;
  420.  
  421.     usemodem = true;
  422.     InitModem ();
  423.  
  424.     printf ("\nDialing...\n\n");
  425.     p = CheckParm ("-dial");
  426.     sprintf (cmd,"ATDT%s",_argv[p+1]);
  427.  
  428.     ModemCommand(cmd);
  429.     ModemResponse ("CONNECT");
  430.     if (strncmp (response+8,"9600",4) )
  431.         Error ("The connection MUST be made at 9600 baud, no error correction, no compression!\n"
  432.                "Check your modem initialization string!");
  433.     doomcom.consoleplayer = 1;
  434. }
  435.  
  436.  
  437. /*
  438. =============
  439. =
  440. = Answer
  441. =
  442. =============
  443. */
  444.  
  445. void Answer (void)
  446. {
  447.     usemodem = true;
  448.     InitModem ();
  449.     printf ("\nWaiting for ring...\n\n");
  450.  
  451.     ModemResponse ("RING");
  452.     ModemCommand ("ATA");
  453.     ModemResponse ("CONNECT");
  454.  
  455.     doomcom.consoleplayer = 0;
  456. }
  457.  
  458.  
  459.  
  460. /*
  461. =================
  462. =
  463. = main
  464. =
  465. =================
  466. */
  467.  
  468. void main(void)
  469. {
  470.     int                p;
  471.  
  472. //
  473. // set network characteristics
  474. //
  475.     doomcom.ticdup = 1;
  476.     doomcom.extratics = 0;
  477.     doomcom.numnodes = 2;
  478.     doomcom.numplayers = 2;
  479.     doomcom.drone = 0;
  480.  
  481.     printf("\n"
  482.            "-------------------------\n"
  483.            "DOOM SERIAL DEVICE DRIVER\n"
  484.            "-------------------------\n");
  485. //
  486. // allow override of automatic player ordering to allow a slower computer
  487. // to be set as player 1 allways
  488. //
  489.     if (CheckParm ("-player1"))
  490.         doomcom.consoleplayer = 1;
  491.     else
  492.         doomcom.consoleplayer = 0;
  493.  
  494. //
  495. // establish communications
  496. //
  497.     InitPort ();
  498.  
  499.     if (CheckParm ("-dial"))
  500.         Dial ();
  501.     else if (CheckParm ("-answer"))
  502.         Answer ();
  503.  
  504.     Connect ();
  505.  
  506. //
  507. // launch DOOM
  508. //
  509.     LaunchDOOM ();
  510.  
  511. #if 0
  512. {
  513. union REGS regs;
  514.  
  515. delay (1000);
  516. doomcom.command = CMD_SEND;
  517. doomcom.datalength = 12;
  518. memcpy (doomcom.data,"abcdefghijklmnop",12);
  519. int86 (doomcom.intnum, ®s, ®s);
  520.  
  521. delay (1000);
  522. doomcom.command = CMD_GET;
  523. doomcom.datalength = 0;
  524. int86 (doomcom.intnum, ®s, ®s);
  525. printf ("datalength: %i\n",doomcom.datalength);
  526.  
  527. delay (1000);
  528. doomcom.command = CMD_SEND;
  529. doomcom.datalength = 12;
  530. memcpy (doomcom.data,"abcdefghijklmnop",12);
  531. int86 (doomcom.intnum, ®s, ®s);
  532.  
  533. delay (1000);
  534. doomcom.command = CMD_GET;
  535. doomcom.datalength = 0;
  536. int86 (doomcom.intnum, ®s, ®s);
  537. printf ("datalength: %i\n",doomcom.datalength);
  538.  
  539. }
  540. #endif
  541.  
  542.     Error (NULL);
  543. }
  544.  
  545.